#!/bin/bash

# ==============================================
# 创建自解压脚本的主脚本
# 用法: bash create_self_extractor.sh <目录> <解压后执行的文件>
# ==============================================

# 检查参数
if [ $# -ne 2 ]; then
    echo "用法: bash $0 <要压缩的目录> <解压后要执行的文件>"
    exit 1
fi

# 检查目录
if [ ! -d "$1" ]; then
    echo "错误: 目录 '$1' 不存在"
    exit 1
fi

# 检测并安装xz工具
ensure_xz_installed() {
    if ! command -v xz &> /dev/null; then
        echo "检测到xz未安装，尝试自动安装..."
        
        # 检测包管理器并安装
        local pkg_managers=("apt-get" "yum" "dnf" "zypper" "pacman")
        local installed=false
        
        for pm in "${pkg_managers[@]}"; do
            if command -v "$pm" &> /dev/null; then
                case "$pm" in
                    "apt-get") sudo apt-get update && sudo apt-get install -y xz-utils ;;
                    "yum") sudo yum install -y xz ;;
                    "dnf") sudo dnf install -y xz ;;
                    "zypper") sudo zypper install -y xz ;;
                    "pacman") sudo pacman -Sy --noconfirm xz ;;
                esac
                
                if [ $? -eq 0 ]; then
                    installed=true
                    break
                fi
            fi
        done
        
        if ! $installed; then
            echo "无法自动安装xz，请手动安装后重试"
            exit 1
        fi
        
        echo "xz安装成功!"
    fi
}

# 确保xz已安装
ensure_xz_installed

# 准备变量
DIR_PATH=$(realpath "$1")
DIR_NAME=$(basename "$DIR_PATH")
EXEC_FILE="$2"
TMP_DIR=$(mktemp -d)
OUTPUT_FILE="${DIR_NAME}_self_extracting.sh"

# 准备临时目录
mkdir -p "$TMP_DIR/$DIR_NAME"
cp -r "$DIR_PATH"/* "$TMP_DIR/$DIR_NAME/"

# 验证执行文件
if [ ! -f "$TMP_DIR/$DIR_NAME/$EXEC_FILE" ]; then
    echo "错误: 文件 '$EXEC_FILE' 在目录中不存在"
    rm -rf "$TMP_DIR"
    exit 1
fi
chmod +x "$TMP_DIR/$DIR_NAME/$EXEC_FILE"

# 创建压缩包
echo "正在创建压缩包..."
tar -cJf "$TMP_DIR/files.tar.xz" -C "$TMP_DIR" "$DIR_NAME"

# 生成自解压脚本
echo "正在生成自解压脚本..."
cat > "$OUTPUT_FILE" <<'EOF'
#!/bin/bash

# ==============================================
# 自解压脚本 - 自动检测依赖并执行安装后脚本
# ==============================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 检测并安装xz工具
ensure_xz_installed() {
    if ! command -v xz &> /dev/null; then
        echo -e "${YELLOW}检测到xz未安装，尝试自动安装...${NC}"
        
        # 检测包管理器
        local pkg_managers=("apt-get" "yum" "dnf" "zypper" "pacman")
        local installed=false
        
        for pm in "${pkg_managers[@]}"; do
            if command -v "$pm" &> /dev/null; then
                case "$pm" in
                    "apt-get") 
                        if ! sudo apt-get update; then
                            continue
                        fi
                        sudo apt-get install -y xz-utils 
                        ;;
                    "yum") sudo yum install -y xz ;;
                    "dnf") sudo dnf install -y xz ;;
                    "zypper") sudo zypper install -y xz ;;
                    "pacman") sudo pacman -Sy --noconfirm xz ;;
                esac
                
                if [ $? -eq 0 ]; then
                    installed=true
                    break
                fi
            fi
        done
        
        if ! $installed; then
            echo -e "${RED}错误: 无法自动安装xz，请手动安装后重试${NC}"
            echo -e "请根据您的系统执行以下命令之一:"
            echo -e "  Debian/Ubuntu: sudo apt-get install xz-utils"
            echo -e "  RHEL/CentOS:   sudo yum install xz"
            echo -e "  Fedora:        sudo dnf install xz"
            echo -e "  openSUSE:      sudo zypper install xz"
            echo -e "  Arch Linux:    sudo pacman -S xz"
            exit 1
        fi
        
        echo -e "${GREEN}xz安装成功!${NC}"
    fi
}

# 主执行函数
main() {
    # 确保xz已安装
    ensure_xz_installed

    # 从脚本变量获取参数
    local DIR_NAME="__DIR_NAME__"
    local EXEC_FILE="__EXEC_FILE__"

    # 检查目录是否存在
    if [ -d "$DIR_NAME" ]; then
        echo -e "${YELLOW}警告: 目录 '$DIR_NAME' 已存在${NC}"
        read -p "是否要覆盖? (y/n) " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            echo "操作取消"
            exit 1
        fi
        rm -rf "$DIR_NAME"
    fi

    # 解压文件
    echo -e "${GREEN}正在解压文件...${NC}"
    ARCHIVE=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' "$0")
    tail -n+$ARCHIVE "$0" | tar -xJ || {
        echo -e "${RED}解压失败!${NC}"
        exit 1
    }

    echo -e "${GREEN}解压完成! 文件已保存到 '$DIR_NAME' 目录${NC}"

    # 执行指定文件
    if [ -f "$DIR_NAME/$EXEC_FILE" ]; then
        echo -e "${GREEN}正在执行 $EXEC_FILE...${NC}"
        (cd "$DIR_NAME" && ./"$EXEC_FILE")
        local ret=$?
        if [ $ret -eq 0 ]; then
            echo -e "${GREEN}$EXEC_FILE 执行成功${NC}"
        else
            echo -e "${RED}$EXEC_FILE 执行失败，返回码: $ret${NC}"
            exit $ret
        fi
    else
        echo -e "${RED}错误: 找不到要执行的文件 '$DIR_NAME/$EXEC_FILE'${NC}"
        exit 1
    fi
}

# 执行主函数
main
exit 0

__ARCHIVE_BELOW__
EOF

# 替换变量
sed -i "s/__DIR_NAME__/$DIR_NAME/g" "$OUTPUT_FILE"
sed -i "s/__EXEC_FILE__/$EXEC_FILE/g" "$OUTPUT_FILE"

# 附加压缩数据
cat "$TMP_DIR/files.tar.xz" >> "$OUTPUT_FILE"
chmod +x "$OUTPUT_FILE"

# 清理
rm -rf "$TMP_DIR"

echo -e "\n${GREEN}自解压脚本创建成功: ${YELLOW}$OUTPUT_FILE${NC}"
echo -e "使用方法:"
echo -e "  1. 将脚本传输到目标机器"
echo -e "  2. 运行: ${YELLOW}./$OUTPUT_FILE${NC}"
echo -e "  3. 脚本将自动:"
echo -e "     - 检测并安装xz(如需要)"
echo -e "     - 解压文件到 ${YELLOW}$DIR_NAME/${NC} 目录"
echo -e "     - 自动执行 ${YELLOW}$DIR_NAME/$EXEC_FILE${NC}"
echo -e "\n注意: 目标机器需要能访问软件源来安装xz"